﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class OrganizacaoPatrocinadorPrestador
    {
        #region Variaveis Membro
        private int _idOrganizacaoRelacao;
        private Organizacao _organizacaoPatrocinador;
        private Organizacao _organizacaoPrestador;
        private Status _status;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdOrganizacaoRelacao
        {
            get { return _idOrganizacaoRelacao; }
            set { _idOrganizacaoRelacao = value; }
        }
        public Organizacao OrganizacaoPatrocinador
        {
            get { return _organizacaoPatrocinador; }
            set { _organizacaoPatrocinador = value; }
        }
        public Organizacao OrganizacaoPrestador
        {
            get { return _organizacaoPrestador; }
            set { _organizacaoPrestador = value; }
        }
        public Status Status
        {
            get { return _status; }
            set { _status = value; }
        }
        #endregion

        #region Construtores
        public OrganizacaoPatrocinadorPrestador()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public OrganizacaoPatrocinadorPrestador(int idOrganizacaoRelacao)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idOrganizacaoRelacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public OrganizacaoPatrocinadorPrestador(int idOrganPatrocinador, int idOrganPrestador)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idOrganPatrocinador, idOrganPrestador);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Metodos Privados
        private void Carregar(int idOrganizacaoRelacao)
        {
            try
            {
                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               where opp.id_organ_relacao == idOrganizacaoRelacao
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listTipoServico = consulta.ToList();

                foreach (var list in listTipoServico)
                {
                    this._idOrganizacaoRelacao = list.id_organ_relacao;
                    this._organizacaoPatrocinador = new Organizacao(list.id_organ_patrocinador);
                    this._organizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    this._status = new Status(list.id_status);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void Carregar(int idOrganPatrocinador, int idOrganPrestador)
        {
            try
            {
                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               where opp.tab_organizacao1.Id_organizacao == idOrganPrestador
                               && opp.tab_organizacao.Id_organizacao == idOrganPatrocinador
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listTipoServico = consulta.ToList();

                foreach (var list in listTipoServico)
                {
                    this._idOrganizacaoRelacao = list.id_organ_relacao;
                    this._organizacaoPatrocinador = new Organizacao(list.id_organ_patrocinador);
                    this._organizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    this._status = new Status(list.id_status);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private bool ExisteCadastro()
        {
            try
            {
                bool existe = false;

                var consulta = from rp in _context.tab_organizacao_relacao_patrocinador
                               where rp.tab_organizacao.Id_organizacao == _organizacaoPatrocinador.IdOrganizacao
                               && rp.tab_organizacao1.Id_organizacao == _organizacaoPrestador.IdOrganizacao
                               select rp;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    existe = true;
                }

                return existe;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos Selecao
        public List<OrganizacaoPatrocinadorPrestador> SelectAll()
        {
            try
            {
                List<OrganizacaoPatrocinadorPrestador> listOrganizacaoPatrocinadorPrestador = new List<OrganizacaoPatrocinadorPrestador>();

                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoPatrocinadorPrestador organizacaoPatrocinadorPrestador = new OrganizacaoPatrocinadorPrestador();
                    organizacaoPatrocinadorPrestador.IdOrganizacaoRelacao = list.id_organ_relacao;
                    organizacaoPatrocinadorPrestador.OrganizacaoPatrocinador = new Organizacao(list.id_organ_patrocinador);
                    organizacaoPatrocinadorPrestador.OrganizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    organizacaoPatrocinadorPrestador.Status = new Status(list.id_status);

                    listOrganizacaoPatrocinadorPrestador.Add(organizacaoPatrocinadorPrestador);
                }

                return listOrganizacaoPatrocinadorPrestador;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public OrganizacaoPatrocinadorPrestador SelectPor(int idOrganPatrocinador, int idOrganPrestador)
        {
            try
            {
                OrganizacaoPatrocinadorPrestador organizacaoPatrocinadorPrestador = new OrganizacaoPatrocinadorPrestador();

                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               where opp.tab_organizacao1.Id_organizacao == idOrganPrestador
                               && opp.tab_organizacao.Id_organizacao == idOrganPatrocinador
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    organizacaoPatrocinadorPrestador.IdOrganizacaoRelacao = list.id_organ_relacao;
                    organizacaoPatrocinadorPrestador.OrganizacaoPatrocinador = new Organizacao(list.id_organ_patrocinador);
                    organizacaoPatrocinadorPrestador.OrganizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    organizacaoPatrocinadorPrestador.Status = new Status(list.id_status);

                    break;
                }

                return organizacaoPatrocinadorPrestador;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoPatrocinadorPrestador> SelectPatrocinadores(int idOrganPrestador)
        {
            try
            {
                List<OrganizacaoPatrocinadorPrestador> listOrganPatrocinadores = new List<OrganizacaoPatrocinadorPrestador>();

                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               where opp.tab_organizacao1.Id_organizacao == idOrganPrestador
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoPatrocinadorPrestador organizacaoPatrocinadorPrestador = new OrganizacaoPatrocinadorPrestador();
                    organizacaoPatrocinadorPrestador.IdOrganizacaoRelacao = list.id_organ_relacao;
                    organizacaoPatrocinadorPrestador.OrganizacaoPatrocinador = new Organizacao(list.id_organ_patrocinador);
                    organizacaoPatrocinadorPrestador.OrganizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    organizacaoPatrocinadorPrestador.Status = new Status(list.id_status);

                    listOrganPatrocinadores.Add(organizacaoPatrocinadorPrestador);
                }

                return listOrganPatrocinadores;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoPatrocinadorPrestador> SelectPrestadores(int idOrganPatrocinador)
        {
            try
            {
                List<OrganizacaoPatrocinadorPrestador> listOrganPrestadores = new List<OrganizacaoPatrocinadorPrestador>();

                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               where opp.tab_organizacao.Id_organizacao == idOrganPatrocinador
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoPatrocinadorPrestador organizacaoPatrocinadorPrestador = new OrganizacaoPatrocinadorPrestador();
                    organizacaoPatrocinadorPrestador.IdOrganizacaoRelacao = list.id_organ_relacao;
                    organizacaoPatrocinadorPrestador.OrganizacaoPatrocinador = new Organizacao(list.id_organ_patrocinador);
                    organizacaoPatrocinadorPrestador.OrganizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    organizacaoPatrocinadorPrestador.Status = new Status(list.id_status);

                    listOrganPrestadores.Add(organizacaoPatrocinadorPrestador);
                }

                return listOrganPrestadores;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public int RetornaIdRelacao(int idOrganPatrocinador, int idOrganPrestador)
        {
            try
            {
                int idOrganRelacao = 0;

                var consulta = from opp in _context.tab_organizacao_relacao_patrocinador
                               where opp.tab_organizacao1.Id_organizacao == idOrganPrestador
                               && opp.tab_organizacao.Id_organizacao == idOrganPatrocinador
                               select new
                               {
                                   opp.id_organ_relacao,
                                   id_organ_patrocinador = opp.tab_organizacao.Id_organizacao,
                                   id_organ_prestador = opp.tab_organizacao1.Id_organizacao,
                                   opp.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idOrganRelacao = list.id_organ_relacao;
                    break;
                }

                return idOrganRelacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persitencia
        public void Salvar()
        {
            try
            {
                if (!ExisteCadastro())
                {
                    tab_organizacao_relacao_patrocinador tabRel = new tab_organizacao_relacao_patrocinador();
                    tabRel.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "id_organ_patrocinador", _organizacaoPatrocinador.IdOrganizacao);
                    tabRel.tab_organizacao1Reference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao1", "id_organ_prestador", _organizacaoPrestador.IdOrganizacao);
                    tabRel.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status_patrocinador", _status.IdStatus);

                    _context.AddTotab_organizacao_relacao_patrocinador(tabRel);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
